package soar.test.db.redis;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import redis.clients.jedis.Jedis;

public class App
{
    private Jedis db;

    public static void main(String[] args)
    {
        new App().run();
    }

    private void run()
    {
        try
        {
            String split = "========================================";
            System.out.println(split);

            db = new Jedis(Conf.redis.host, Conf.redis.port);

            test_string();
            System.out.println(split);

            test_map();
            System.out.println(split);

            test_list();
            System.out.println(split);

            test_set();
            System.out.println(split);
        }
        catch (Exception e)
        {
            System.err.println(String.format("fail: %s", e));
        }
    }

    private void test_string()
    {
        String key = "name";

        // -----添加数据----------
        db.set(key, "xinxin");// 向key-->name中放入了value-->xinxin
        System.out.println(db.get(key));// 执行结果：xinxin

        db.append(key, " is my lover"); // 拼接
        System.out.println(db.get(key));

        db.del(key); // 删除某个键
        System.out.println(db.get(key));

        // 设置多个键值对
        String key2 = "age";
        String key3 = "qq";
        db.mset(key, "liuling", key2, "23", key3, "476777389");
        db.incr(key2); // 进行加1操作
        System.out.println(db.get(key) + "-" + db.get(key2) + "-"
                + db.get(key3));
    }

    private void test_map()
    {
        String key = "user";

        // -----添加数据----------
        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "xinxin");
        map.put("age", "22");
        map.put("qq", "123456");
        db.hmset("user", map);
        // 取出user中的name，执行结果:[minxr]-->注意结果是一个泛型的List
        // 第一个参数是存入redis中map对象的key，后面跟的是放入map中的对象的key，后面的key可以跟多个，是可变参数
        List<String> rsmap = db.hmget(key, "name", "age", "qq");
        System.out.println(rsmap);

        // 删除map中的某个键值
        db.hdel(key, "age");
        System.out.println(db.hmget(key, "age")); // 因为删除了，所以返回的是null
        System.out.println(db.hlen(key)); // 返回key为user的键中存放的值的个数2
        System.out.println(db.exists(key));// 是否存在key为user的记录 返回true
        System.out.println(db.hkeys(key));// 返回map对象中的所有key
        System.out.println(db.hvals(key));// 返回map对象中的所有value

        Iterator<String> iter = db.hkeys(key).iterator();
        while (iter.hasNext())
        {
            String k = iter.next();
            System.out.println(k + ":" + db.hmget(key, k));
        }
    }

    private void test_list()
    {
        String key = "java framework";

        // 开始前，先移除所有的内容
        db.del(key);
        System.out.println(db.lrange(key, 0, -1));
        // 先向key java framework中存放三条数据
        db.lpush(key, "spring");
        db.lpush(key, "struts");
        db.lpush(key, "hibernate");
        // 再取出所有数据jedis.lrange是按范围取出，
        // 第一个是key，第二个是起始位置，第三个是结束位置，jedis.llen获取长度 -1表示取得所有
        System.out.println(db.lrange(key, 0, -1));

        db.del(key);
        db.rpush(key, "spring");
        db.rpush(key, "struts");
        db.rpush(key, "hibernate");
        System.out.println(db.lrange(key, 0, -1));

        // jedis 排序
        // 注意，此处的rpush和lpush是List的操作。是一个双向链表（但从表现来看的）
        key = "a";
        db.del(key);// 先清除数据，再加入数据进行测试
        db.rpush(key, "1");
        db.lpush(key, "6");
        db.lpush(key, "3");
        db.lpush(key, "9");
        System.out.println(db.lrange(key, 0, -1));// [9, 3, 6, 1]
        System.out.println(db.sort(key)); // [1, 3, 6, 9] //输入排序后结果
        System.out.println(db.lrange(key, 0, -1));
    }

    private void test_set()
    {
        String key = "users";

        // 添加
        db.sadd(key, "liuling");
        db.sadd(key, "xinxin");
        db.sadd(key, "ling");
        db.sadd(key, "zhangxinxin");
        db.sadd(key, "who");
        // 移除noname
        db.srem(key, "who");
        System.out.println(db.smembers(key));// 获取所有加入的value
        System.out.println(db.sismember(key, "who"));// 判断 who
                                                     // 是否是user集合的元素
        System.out.println(db.srandmember(key));
        System.out.println(db.scard(key));// 返回集合的元素个数
    }
}

class Conf
{
    public static class Redis
    {
        public String id;
//        public String user;
//        public String password;
//        public String database;
        public String host;
        public int port;
    }

    public static Redis redis;

    static
    {
        redis = new Redis();
        redis.id = "local";
        redis.host = "localhost";
        redis.port = 6379;
    }
}